/**
 * 基础服务类
 * 提供统一的HTTP请求方法和错误处理
 */
import { apiConfig, ApiConfig } from './api-config'
import type { ApiResponse } from '../../../types/api'

// 错误类型定义
export interface ApiError {
  code: string | number
  message: string
  timestamp: number
  data?: any
}


// 分页响应
export interface PageResult<T> {
  records: T[]
  total: number
  size: number
  current: number
  pages: number
}

export abstract class BaseService {
  protected axiosInstance = apiConfig.getAxiosInstance()

  constructor() {
    // 不再需要实例级别的baseURL，使用ApiConfig中的全局配置
  }

  /**
   * 统一请求方法
   */
  protected async request<T = any>(
    config: any
  ): Promise<ApiResponse<T>> {
    try {
      const response: any = await this.axiosInstance({
        ...config,
        url: this.buildUrl(config.url || '')
      })

      return this.formatResponse<T>(response)
    } catch (error: any) {
      return this.handleError<T>(error)
    }
  }

  /**
   * GET请求
   */
  protected async get<T = any>(
    url: string,
    params?: any,
    config?: any
  ): Promise<ApiResponse<T>> {
    return this.request<T>({
      method: 'GET',
      url,
      params,
      ...config
    })
  }

  /**
   * POST请求
   */
  protected async post<T = any>(
    url: string,
    data?: any,
    config?: any
  ): Promise<ApiResponse<T>> {
    return this.request<T>({
      method: 'POST',
      url,
      data,
      ...config
    })
  }

  /**
   * PUT请求
   */
  protected async put<T = any>(
    url: string,
    data?: any,
    config?: any
  ): Promise<ApiResponse<T>> {
    return this.request<T>({
      method: 'PUT',
      url,
      data,
      ...config
    })
  }

  /**
   * DELETE请求
   */
  protected async delete<T = any>(
    url: string,
    config?: any
  ): Promise<ApiResponse<T>> {
    return this.request<T>({
      method: 'DELETE',
      url,
      ...config
    })
  }

  /**
   * PATCH请求
   */
  protected async patch<T = any>(
    url: string,
    data?: any,
    config?: any
  ): Promise<ApiResponse<T>> {
    return this.request<T>({
      method: 'PATCH',
      url,
      data,
      ...config
    })
  }

  /**
   * 构建完整URL
   */
  private buildUrl(url: string): string {
    if (url.startsWith('http')) {
      return url
    }
  
    return url
  }

  /**
   * 格式化响应数据
   */
  private formatResponse<T>(response: any): ApiResponse<T> {
    const { data, status } = response
    
    // 根据后端响应格式调整
    if (data && typeof data === 'object') {
      // 如果后端返回了统一的响应格式
      if ('code' in data) {
        return {
          code: data.code,
          msg: data.msg || data.message || 'success',
          data: data.data
        }
      }
    }

    // 默认格式 - 转换为RestVO格式
    return {
      code: status >= 200 && status < 300 ? 0 : status,
      msg: status >= 200 && status < 300 ? 'success' : '请求失败',
      data: data
    }
  }

  /**
   * 统一错误处理
   */
  private handleError<T>(error: any): ApiResponse<T> {
    console.error('API请求错误:', error);

    let errorResponse: ApiResponse<T> = {
      code: -1,
      msg: '网络请求失败，请稍后重试',
      data: null as any
    }

    if (error.response) {
      // 服务器返回了错误状态码
      const { status, data } = error.response
      
      errorResponse = {
        code: data?.code || status,
        msg: data?.msg || data?.message || `请求失败 (${status})`,
        data: data
      }
      
      // 检查是否是认证失败的特殊情况 (仅处理HTTP 401状态码)
      if (status === 401 || data?.code === 401) {
        // 触发全局认证错误事件，显示登录弹窗
        console.log('检测到认证错误，触发auth-error事件')
        window.dispatchEvent(new CustomEvent('auth-error'))
        
        // 同时尝试直接调用登录弹窗服务
        import('../../auth/services/auth-prompt-service').then(({ authPromptService }) => {
          authPromptService.showLoginPrompt().catch(err => {
            console.error('显示登录弹窗失败:', err)
          })
        }).catch(err => {
          console.error('导入登录弹窗服务失败:', err)
        })
      }
    } else if (error.request) {
      // 请求已发送但没有收到响应
      errorResponse.msg = '网络连接失败，请检查网络设置'
      errorResponse.code = -1
    } else if (error.code === 'ECONNABORTED') {
      // 请求超时
      errorResponse.msg = '请求超时，请稍后重试'
      errorResponse.code = -1
    }

    return errorResponse
  }

  /**
   * 获取认证token（静态方法）
   */
  public static async getToken(): Promise<string | null> {
    return ApiConfig.getToken()
  }

  /**
   * 设置认证token（静态方法）
   */
  public static async setToken(token: string): Promise<void> {
    console.log('BaseService.setToken: 调用ApiConfig.setToken', token ? '有效' : '无效或为空')
    ApiConfig.setToken(token)
  }

  /**
   * 清除认证token（静态方法）
   */
  public static async clearToken(): Promise<void> {
    ApiConfig.clearToken()
  }

  /**
   * 设置消息实例（静态方法）
   * 用于在服务类中显示消息提示
   */
  public static setMessageInstance(_message: any): void {
    // 目前BaseService不需要消息实例，但为了兼容性保留此方法
    console.log('BaseService.setMessageInstance called, but not implemented');
  }

  /**
   * 获取API基础URL（静态方法）
   */
  public static getApiUrl(): string {
    return ApiConfig.getApiUrl()
  }
}

export default BaseService